int countA=0;//记录由南向北通行时桥面车辆数，初始化为0；
int countB=0;//记录由北向南通行时桥面车辆数，初始化为0；
int totalA=0;//记录该次由南向北通行时上桥车辆总数，初始化为0；
int totalB=0;//记录该次由北向南通行时上桥车辆总数，初始化为0；
int Iswait =0;//标明桥头是否有车被阻止
semaphore mutex_A=1;//互斥信号量，保证对信号量countA=0、totalA或Iswait的互斥读写；
semaphore mutex_B=1;//互斥信号量，保证对信号量countB=0、totalB或Iswait的互斥读写；
semaphore mutex=1;//互斥信号量，保证对桥面的互斥使用
semaphore flag=0;//控制上桥车辆是否有超过单次上限；
/*
    说明：k为单次通过车辆上限；从而避免饥饿现象；
*/
South_to_North()
{
    while (true)
    {
        到达桥头
        P(mutex_A);//获取countA和totalA修改权限；
        if (countA==0)
        {//该方向第一个车辆，则申请获取通过权限;
            P(mutex);
        }
        if (totalA==k)
        {//如果已经达到通过车辆上限，则阻止上桥；
            Iswait=1;
            P(flag);
        }
        countA++;//其他情况，（即后续未超过上限的车辆）正常上桥，桥面车辆数加1
        totalA++;//该方向上桥车辆总数加1；
        V(mutex_A);//释放countA修改权限
        过桥；
        P(mutex_A);//获取countA和totalA修改权限；
        countA--;//下桥减1；
        if (countA==0&&Iswait==0)
        {//如果桥面已无车辆且桥头无等待：
            V(mutex);//释放桥面通行权限；
            totalA=0;//该单次通行结束
        }
        if (countA==0&&Iswait==1)
        {//如果该方向桥面已无车辆但桥头有等待:
            V(mutex);//释放桥通行权限；
            V(flag);//不再阻止上桥；
            Iswait=0;//不在需要等待；
            totalA=0;//该单次通行结束；
        }
        V(mutex_A); //释放countA修改权限
    }
    
}

North_to_South()
{
    while (true)
    {
        到达桥头
        P(mutex_B);//获取countB和totalB修改权限；
        if (countB==0)
        {//该方向第一个车辆，则申请获取通过权限;
            P(mutex);
        }
        if (totalB==k)
        {//如果已经达到通过车辆上限，则阻止上桥；
            Iswait=1;
            P(flag);
        }
        countB++;//其他情况，（即后续未超过上限）正常上桥，桥面车辆数加1
        totalB++;//该方向上桥车辆总数加1；
        V(mutex_B);//释放countB和totalB修改权限
        过桥；
        P(mutex_B);//获取countB修改权限；
        countB--;//下桥减1；
        if (countB==0&&Iswait==0)
        {//如果该方向桥面已无车辆且桥头无等待：
            V(mutex);//释放桥面通行权限；
            totalB=0;//该单次通行结束
        }
        if (countB==0&&Iswait==1)
        {//如果该方向桥面已无车辆但桥头有等待:
            V(mutex);//释放桥通行权限
            V(flag);//不再阻止上桥；
            Iswait=0;//不在需要等待；
            totalB=0;//该单次通行结束；
        }
        V(mutex_B); //释放countB修改权限；
    }
    
}